package br.com.sgi.util;



import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil implements Serializable {

	private static final long serialVersionUID = 4721671662697188161L;
	
	private static final String pt_BR = "dd/MM/yyyy";

	/**
	 * Retorna a data atual no formato Date.
	 */
	public static Date getDateNow() {
		return new Date(System.currentTimeMillis());
	}

	/**
	 * Retorna a data atual no formato String.
	 */
	public static String getDateNowStr() {
		DateFormat df = new SimpleDateFormat(pt_BR);
		return df.format(getDateNow());
	}
	
	/**
	 * Retorna uma String de data no formato "dd/MM/yyyy".
	 */
	public static String getDateStr(Date date) {
		DateFormat df = new SimpleDateFormat(pt_BR);
		return df.format(date);
	}

	/**
	 * Retorna um Date da String fornecida "dd/MM/yyyy".
	 */
	public static Date getDate(String strDate) {
		Date date = null;
		DateFormat df = new SimpleDateFormat(pt_BR);
		try {
			if ((strDate != null) && !(strDate.equals("")))
				date = df.parse(strDate);
		} catch (ParseException e) {
			System.out.println(e.getMessage());
		}
		return date;
	}
	
	/**
	 * Retorna um Date como uma sql.Date String fornecida "dd/MM/yyyy".
	 */
	public static java.sql.Date getSqlDate(String strDate) {
		Date date = getDate(strDate);
		java.sql.Date dataSql;
		dataSql = new java.sql.Date(date.getTime());
		return dataSql;
	}

	/**
	 * Remove a qtd de meses na data informada.
	 */
	public static Date removeMonth(Date date, int qtdMonth) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MONTH, -qtdMonth);
		return cal.getTime();
	}

	/**
	 * Remove a qtd de dias na data informada.
	 */
	public static Date removeDay(Date date, int qtdDay) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DAY_OF_MONTH, -qtdDay);
		return cal.getTime();
	}

	/**
	 * Remove a qtd de anos na data informada.
	 */
	public static Date removeYear(Date date, int qtdYear) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.YEAR, -qtdYear);
		return cal.getTime();
	}


	/**
	 * Retorna uma String contendo a data atual por extenso.
	 * */
	public static String getDataAtualPorExtenso() {
		DateFormat df = new SimpleDateFormat("EEEE, d MMMM yyyy");
		return df.format(new Date(System.currentTimeMillis()));
	}

	/**
	 * Verifica se a data informada está dentro do Per�odo de Data aceito pelo
	 * Sistema. Não pode ser superior a data atual.
	 * */
	public static boolean isDateValidSinan(Date date) {
	    if (date == null)
        	    return true;
	    
	    return (date.getTime() <= getDateNow().getTime());
	}


	
        /**
         * Verifica se a data informada está dentro do Período de Data aceito pelo
         * Sistema. Não pode ser anterior a 01/01/1900.
         * */
        public static boolean isMinDateValidSinan(Date date) {
            	if (date == null)
            	    return true;
            	    
    		return (date.getTime() >= getDate("01/01/1900").getTime());
        }
        
        /**
         * 
         * Verifica se o periodo informado a maior do que 1 ano
         * @param start
         * @param end
         * @return
         */
        public static boolean isAfterOneYear(Date start, Date end) {
        	Calendar cal = Calendar.getInstance();
        	cal.setTime(start);
        	cal.add(Calendar.YEAR, 1); 
        	if (end.after(cal.getTime())){
        		return true;
        	}
        	return false;
        }
        
    	public static boolean isNullOrEmptyDate(Date data){		
    		return (data == null) || (data.getTime() == 0);
    	}
}
